﻿using System;
using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Core.Data
{
    /// <summary>
    /// 文章管理类
    /// </summary>
    public static class PostManager
    {
        private static Wedn.Interface.DAL.IPost dao;

        /// <summary>
        /// 静态全局缓存文章
        /// </summary>
        private static List<Post> posts;
        /// <summary>
        /// 静态全局缓存文章
        /// </summary>
        public static List<Post> Posts
        {
            get
            {
                if (posts == null)
                {
                    LoadStaticPost();
                }
                return posts;
            }
        }
        private static object lockHelper = new object();
        private static void LoadStaticPost()
        {
            if (posts == null)
            {
                lock (lockHelper)
                {
                    if (posts == null)
                    {
                        posts = dao.SelectPostList(0, "post", Convert.ToInt32(OptionManager.Settings["PostCacheSize"]), 1, "post_pubdate", 0);
                    }
                }
            }
        }
        /// <summary>
        /// 文章管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        static PostManager()
        {
            dao = Wedn.Interface.DAOFactory.CreatePostDAO();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
            LoadStaticPost();
        }
        /// <summary>
        /// 从缓存中取文章
        /// </summary>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码</param>
        /// <returns>符合条件文章信息对象集合, 不存在则返回NULL</returns>
        public static List<Post> GetPostList(int pageSize, int pageIndex)
        {
            List<Post> list = new List<Post>();
            if (pageSize * pageIndex <= 20)
            {
                for (int i = (pageIndex - 1) * pageSize; i < pageIndex * pageSize; i++)
                {
                    if (i >= Convert.ToInt32(OptionManager.Settings["PostCacheSize"]))
                    {
                        break;
                    }
                    list.Add(posts[i]);
                }
            }
            else
            {
                list = GetPostListFromDb(0, "post", pageSize, pageIndex, "post_pubdate", 0);
            }
            return list;
        }
        /// <summary>
        /// 从缓存中取文章
        /// </summary>
        /// <param name="postid">文章ID</param>
        /// <returns>符合条件文章信息对象, 不存在则返回NULL</returns>
        public static Post GetPost(int postid)
        {
            foreach (Post item in posts)
            {
                if (item.Id == postid)
                {
                    return item;
                }
            }
            return GetPostFromDb(postid);
        }
        /// <summary>
        /// 从缓存中取文章
        /// </summary>
        /// <param name="slug">文章别名</param>
        /// <returns>符合条件文章信息对象, 不存在则返回NULL</returns>
        public static Post GetPost(string slug)
        {
            foreach (Post item in posts)
            {
                if (item.Slug == slug)
                {
                    return item;
                }
            }
            return GetPostFromDb(slug);
        }

        /// <summary>
        /// 检查表中是否已经存在该别名, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="slug">要确定的别名</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        public static bool ExistsSlug(string slug)
        {
            return dao.Exists(slug);
        }

        /// <summary>
        /// 选取文章信息表中文章总数
        /// </summary>
        /// <param name="where">选择条件(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        public static int GetPostsCount(string where)
        {
            return dao.SelectPostsCount(where);
        }

        /// <summary>
        /// 选取文章信息表中所有文章信息, 返回文章信息对象集合
        /// </summary>
        /// <returns>所有文章信息集合</returns>
        public static List<Post> GetPostListFromDb()
        {
            return dao.SelectPostList();
        }

        /// <summary>
        /// 根据指定状态, 指定浏览等级, 指定页码, 和页面大小 按照指定字段和排序规则排列
        /// 从文章信息表中选取指定条数文章信息
        /// 如果指定int类型参数传入-1, string传入null, 则表示忽略该检索条件
        /// 将默认按照更新时间降序排序, 返回文章信息对象集合, 不存在则返回NULL(简化版)
        /// </summary>
        /// <param name="status">文章当前状态(0:发布, 1:加密, 2:私密, 4:草稿, 5:回收站)(忽略该条件则传入-1)</param>
        /// <param name="type">文章类型(忽略该条件则传入null)</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <returns>符合条件文章信息对象集合, 不存在则返回NULL</returns>
        public static List<Post> GetPostListFromDb(int status, string type, int pageSize, int pageIndex, string orderField, int order)
        {
            return dao.SelectPostList(status, type, pageSize, pageIndex, orderField, order);
        }

        /// <summary>
        /// 根据指定关键词, 状态, 浏览等级, 类别ID, 用户ID, 开始时间, 结束时间, 指定页码, 和页面大小 按照指定字段和排序规则排列
        /// 从文章信息表中选取指定条数文章信息
        /// 如果指定int类型参数传入-1, string传入null, 则表示忽略该检索条件
        /// 将默认按照更新时间降序排序, 返回文章信息对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="keyword">关键词(忽略该条件则传入null)</param>
        /// <param name="status">文章当前状态(0:发布, 1:加密, 2:私密, 4:草稿, 5:回收站)(忽略该条件则传入-1)</param>
        /// <param name="type">文章类型(忽略该条件则传入null)</param>
        /// <param name="categoryId">类别ID(忽略该条件则传入-1)</param>
        /// <param name="userId">用户ID(忽略该条件则传入-1)</param>
        /// <param name="beginDate">起始日期(忽略该条件则传入null)</param>
        /// <param name="endDate">截至日期(忽略该条件则传入null)</param>
        /// <param name="pageSize">每页显示条数</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <param name="recordCount">返回查询到的记录数</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        public static List<Post> GetPostListFromDb(string keyword, int status, string type, int categoryId, int userId, string beginDate, string endDate, int pageSize, int pageIndex, string orderField, int order, out int recordCount)
        {
            return dao.SelectPostList(keyword, status, type, categoryId, userId, beginDate, endDate, pageSize, pageIndex, orderField, order, out recordCount);
        }

        /// <summary>
        /// 根据文章归档年月选取文章信息集合默认按照更新时间降序排序, 返回对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="beginDate">开始时间</param>
        /// <param name="endDate">结束时间</param>
        /// <param name="status">文章当前状态(0:发布, 1:加密, 2:私密, 4:草稿, 5:回收站)(忽略该条件则传入-1)</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        public static List<Post> GetPostListFromDb(string beginDate, string endDate, int status)
        {
            return dao.SelectPostList(beginDate, endDate, status);
        }

        /// <summary>
        /// 根据用户ID选取文章信息集合默认按照更新时间降序排序, 返回对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="userid">用户ID</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        public static List<Post> GetPostListFromDb(int userid)
        {
            return dao.SelectPostList(userid);
        }

        /// <summary>
        /// 根据ID数组批量获取文章信息集合, 返回对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="ids">文章ID数组</param>
        /// <param name="status">文章当前状态(0:发布, 1:加密, 2:私密, 4:草稿, 5:回收站)(忽略该条件则传入-1)</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        public static List<Post> GetPostListFromDb(int[] ids, int status)
        {
            return dao.SelectPostList(ids, status);
        }

        /// <summary>
        /// 选取文章归档信息集合, 返回对象集合, 不存在则返回NULL
        /// </summary>
        /// <returns>文章归档信息集合, 不存在则返回NULL</returns>
        public static List<Archive> GetArchiveListFromDb()
        {
            return dao.SelectArchiveList();
        }

        /// <summary>
        /// 根据文章ID选取文章信息对象, 返回文章信息对象, 不存在则返回NULL
        /// </summary>
        /// <param name="id">文章ID</param>
        /// <returns>文章对象, 不存在则返回NULL</returns>
        public static Post GetPostFromDb(int id)
        {
            return dao.SelectPost(id);
        }

        /// <summary>
        /// 根据文章Slug选取文章信息对象, 返回文章信息对象, 不存在则返回NULL
        /// </summary>
        /// <param name="slug">文章Sulg</param>
        /// <returns>文章对象, 不存在则返回NULL</returns>
        public static Post GetPostFromDb(string slug)
        {
            return dao.SelectPost(slug);
        }

        /// <summary>
        /// 向文章表中插入一行数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="post">要插入的文章对象</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Insert(Post post)
        {
            return dao.Insert(post);
        }

        /// <summary>
        /// 根据文章ID删除对应文章表中的文章记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除的文章ID</param>
        /// <param name="deleteComment">是否删除该文章对应所有评论</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Delete(int id, bool deleteComment)
        {
            return dao.Delete(id, deleteComment);
        }

        /// <summary>
        /// 根据文章ID数组删除对应文章表中的文章记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除的文章ID数组</param>
        /// <param name="deleteComment">是否删除该文章对应所有评论</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Delete(int[] ids, bool deleteComment)
        {
            return dao.Delete(ids, deleteComment);
        }

        /// <summary>
        /// 更新一个完整文章对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="post">更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdatePost(Post post)
        {
            return dao.UpdatePost(post);
        }

        /// <summary>
        /// 根据文章ID数组批量更新文章状态, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要更新的文章ID数组</param>
        /// <param name="status">更新的状态(0:发布, 1:加密, 2:私密, 4:草稿, 5:回收站)</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateStatus(int[] ids, int status)
        {
            return dao.UpdateStatus(ids, status);
        }

        /// <summary>
        /// 根据文章ID更新文章标题,副标题,别名,内容, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="title">更新的标题(不更新则传入null)</param>
        /// <param name="subTitle">更新的副标题(不更新则传入null)</param>
        /// <param name="slug">更新的别名(不更新则传入null)</param>
        /// <param name="content">更新的内容(不更新则传入null)</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateInfo(int id, string title, string subTitle, string slug, string content)
        {
            return dao.UpdateInfo(id, title, subTitle, slug, content);
        }

        /// <summary>
        /// 根据文章ID更新文章浏览次数, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateViewCount(int id, int addCount)
        {
            return dao.UpdateViewCount(id, addCount);
        }

        /// <summary>
        /// 根据文章ID更新文章浏览次数, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateCommentCount(int id, int addCount)
        {
            return dao.UpdateCommentCount(id, addCount);
        }

        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public static int GetMaxId()
        {
            return dao.SelectMaxId();
        }
    }
}